package Vue;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.print.PageFormat;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.UIManager;

import Controleur.Controleur;
import Model.Dessin;

/**
 * Cette class permet de définir et gérer le menu de la fenêtre principal du programme. 
 * 
 * @author Kilian Cousein et Benjamin Tardieu
 */
public class BarreMenu extends JMenuBar implements ActionListener
{
//======================================================================//
//============================ Variables ===============================//
//======================================================================//
	
	private Controleur controleur;
	
	private JMenuBar menuBar = new JMenuBar();
	private JMenu fichier = new JMenu("Fichier");
	private JMenu edition = new JMenu("Edition");

	private JMenuItem nouveau = new JMenuItem("Nouveau");
	private JMenuItem ouvrir = new JMenuItem("Ouvrir");
	private JMenuItem enregistrer = new JMenuItem("Enregistrer");
	private JMenuItem enregistrerSous = new JMenuItem("Enregistrer sous");
	private JMenuItem quitter = new JMenuItem("Quitter");
	
	private JMenuItem annuler = new JMenuItem("Annuler");
	private JMenuItem retablir = new JMenuItem("Rétablir");
	
	private JMenuItem imprimer = new JMenuItem("Imprimer");

	private JMenu exporter = new JMenu("Exporter");
	private JMenuItem bitmap = new JMenuItem("Bitmap");
	private JMenuItem jpeg = new JMenuItem("JPEG");
	private JMenuItem png = new JMenuItem("PNG");
	private JMenuItem gif = new JMenuItem("GIF");
	
	private JMenuItem copier = new JMenuItem("Copier");
	private JMenuItem couper = new JMenuItem("Couper");
	private JMenuItem coller = new JMenuItem("Coller");


	
	
//======================================================================//
//========================== Constructeurs =============================//
//======================================================================//
	
	public BarreMenu(Controleur controleur)
	{
		this.controleur = controleur;
		
		this.nouveau.setName("nouveau");
		this.nouveau.addActionListener(this);
		this.fichier.add(nouveau);
		
		this.ouvrir.setName("ouvrir");
		this.ouvrir.addActionListener(this);
		this.fichier.add(ouvrir);
		
		this.enregistrer.setName("sauvegarder");
		this.enregistrer.setEnabled(false);
		this.enregistrer.addActionListener(this);
		this.fichier.add(enregistrer);
		
		this.enregistrerSous.setName("sauvegarderSous");
		this.enregistrerSous.addActionListener(this);
		this.fichier.add(enregistrerSous);
		
		this.fichier.addSeparator();
		this.fichier.add(imprimer);
		this.imprimer.setName("imprimer");
		this.imprimer.addActionListener(this);
		this.fichier.addSeparator();
		
		this.fichier.add(exporter);
		
		this.bitmap.setName("bmp");
		this.bitmap.addActionListener(this);
		this.exporter.add(this.bitmap);
		this.jpeg.setName("jpeg");
		this.jpeg.addActionListener(this);
		this.exporter.add(this.jpeg);
		this.png.setName("png");
		this.png.addActionListener(this);
		this.exporter.add(this.png);
		this.gif.setName("gif");
		this.gif.addActionListener(this);
		this.exporter.add(this.gif);
		
		this.fichier.addSeparator();
		
		this.quitter.setName("quitter");
		this.quitter.addActionListener(this);
		this.fichier.add(quitter);
		
		this.annuler.setName("annuler");
		this.annuler.setEnabled(false);
		this.annuler.addActionListener(this);
		this.edition.add(annuler);
		
		this.retablir.setName("retablir");
		this.retablir.setEnabled(false);
		this.retablir.addActionListener(this);
		this.edition.add(retablir);
		this.edition.addSeparator();
		this.edition.add(copier);
		copier.setName("copier");
		copier.addActionListener(this);
		this.edition.add(couper);
		couper.setName("couper");
		couper.addActionListener(this);
		this.edition.add(coller);
		coller.setName("coller");
		coller.addActionListener(this);

		
		this.add(fichier);
		this.add(edition);
		
		this.nouveau.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_DOWN_MASK));
		this.ouvrir.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_DOWN_MASK));
		this.enregistrer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK));
		this.enregistrerSous.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK + KeyEvent.SHIFT_DOWN_MASK));
		this.annuler.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.CTRL_DOWN_MASK));
		this.retablir.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, KeyEvent.CTRL_DOWN_MASK));
		
		this.imprimer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK));
		this.copier.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK));
		this.couper.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_DOWN_MASK));
		this.coller.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_DOWN_MASK));
	}
	
	
//======================================================================//
//============================= Méthodes ===============================//
//======================================================================//
	
	public void desactiverEnregistrement()
	{
		this.enregistrer.setEnabled(false);
	}
	
	
	public void activerEnregistrement()
	{
		this.enregistrer.setEnabled(true);
	}
	
	
	public void desactiverAnnuler()
	{
		this.annuler.setEnabled(false);
	}
    
	
    public void activerAnnuler()
	{
		this.annuler.setEnabled(true);
	}
    
    
    public void desactiverRetablir()
	{
		this.retablir.setEnabled(false);
	}
    
    
    public void activerRetablir()
	{
		this.retablir.setEnabled(true);
	}
    
    
//======================================================================//
//====================== Méthodes Implémentées= ========================//
//======================================================================//
    
    @Override
	public void actionPerformed(ActionEvent e)
	{
    	JMenuItem menu = (JMenuItem) e.getSource();
		
		if(menu.getName() == "nouveau")
		{
				final JFrame fenetre = new JFrame("Nouneau");			
				GridLayout layout = new GridLayout(4, 3, 5, 5);
				JPanel panneau = new JPanel(layout);
				JLabel labelNom = new JLabel("Nom :");
				final JTextField fieldNom = new JTextField("Sans titre");
				JLabel labelLargeur = new JLabel("Largeur :");
				final JTextField fieldLargeur = new JTextField("800");
				JLabel labelHauteur = new JLabel("Hauteur :");
				final JTextField fieldHauteur = new JTextField("600");
				JButton boutonOk = new JButton("Ok");
				JButton boutonAnnuler = new JButton("Annuler");
				JLabel labelPixels1 = new JLabel("pixels");
				JLabel labelPixels2 = new JLabel("pixels");
				JLabel label1 = new JLabel("");
				JLabel label2 = new JLabel("");
				
				panneau.add(labelNom);
				panneau.add(fieldNom);
				panneau.add(label1);
				panneau.add(labelLargeur);
				panneau.add(fieldLargeur);
				panneau.add(labelPixels1);
				panneau.add(labelHauteur);
				panneau.add(fieldHauteur);
				panneau.add(labelPixels2);
				panneau.add(label2);
				panneau.add(boutonAnnuler);
				panneau.add(boutonOk);
		    	fenetre.add(panneau);
		    	
		    	panneau.setBorder(BorderFactory.createEmptyBorder(10, 25, 10, 25));  
				
				fenetre.setVisible(true);
				fenetre.pack();
			
				boutonAnnuler.addActionListener(new ActionListener()
				{
					@Override
					public void actionPerformed(ActionEvent e)
					{
						fenetre.dispose();
					}
				});
				
				boutonOk.addActionListener(new ActionListener()
				{
					@Override
					public void actionPerformed(ActionEvent e)
					{
						controleur.nouveauDessin(fieldNom.getText(), Integer.valueOf(fieldLargeur.getText()), Integer.valueOf(fieldHauteur.getText()));
						fenetre.dispose();
					}
				});
			
		}
		else if(menu.getName() == "ouvrir")		
		{	
			this.controleur.ouvrir();
		}
		else if(menu.getName() == "sauvegarder")
		{
			this.controleur.enregistrer();
		}
		else if(menu.getName() == "sauvegarderSous")
		{
			this.controleur.enregistrerSous();
		}
		else if(menu.getName() == "imprimer")
		{
			PrinterJob job = PrinterJob.getPrinterJob();
	        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
	        PageFormat pf = job.pageDialog(aset);
	        job.setPrintable(new Dessin(this.controleur.getMotifs()), pf);
	        
	        if(job.printDialog(aset)) 
	        {
	            try 
	            {
	                 job.print(aset);
	            }
	            catch (PrinterException ex) {}
	        }
		}
		else if(menu.getName() == "bmp" || menu.getName() == "jpeg" || menu.getName() == "png" || menu.getName() == "gif")
		{
			this.controleur.exporter(menu.getName());
		}
		else if(menu.getName() == "annuler")
		{
			this.controleur.annuler();
		}
		else if(menu.getName() == "retablir")
		{
			this.controleur.retablir();
		}
		else if(menu.getName() == "zoomOut")
		{
			this.controleur.zoomOut();
		}
		else if(menu.getName() == "zoomIn")
		{
			this.controleur.zoomIn();
		}
		else if(menu.getName() == "quitter")
		{
			this.controleur.quitter();
		}
		else if(menu.getName() == "copier")
		{
			this.controleur.copier();
		}
		else if(menu.getName() == "couper")
		{
			this.controleur.couper();
		}
		else if(menu.getName() == "coller")
		{
			this.controleur.coller();
		}
		else
		{
			System.out.println("BarOutils: Action \""+ menu.getName() +"\" n'est pas encore implémentée.");
		}
	}
}